Análise Exploratória

##   rows columns discrete_columns continuous_columns all_missing_columns
## 1 2380      37               26                 11                   0
##   total_missing_values complete_rows total_observations memory_usage
## 1                    0          2380              88060      1060944

Visualizando os tipos de colunas do banco de dados

Visulizando a distribuicao de valores ausentes

Visulizando a distribuicao de valores ausentes

Visulizando a distribuicao do preenchimento das principais colunas

Visulizando os tipos e formatos de valores das colunas

## 'data.frame':    2380 obs. of  37 variables:
##  $ data                     : chr  "2021-01-01" "2021-01-01" "2021-01-02" "2021-01-02" ...
##  $ hora                     : chr  "19:44:00" "23:15:40" "10:54:00" "11:13:00" ...
##  $ natureza_acidente        : chr  "COM VÍTIMA" "COM VÍTIMA" "COM VÍTIMA" "COM VÍTIMA" ...
##  $ situacao                 : chr  "FINALIZADA" "FINALIZADA" "FINALIZADA" "FINALIZADA" ...
##  $ bairro                   : chr  "MADALENA" "VÁRZEA" "VASCO DA GAMA" "BOA VIAGEM" ...
##  $ endereco                 : chr  "RUA BENFICA" "AV CAXANGA" "RUA RESPLENDOR" "RUA VISCONDE DE JEQUITINHONHA" ...
##  $ numero                   : chr  "" "" "353" "22" ...
##  $ detalhe_endereco_acidente: chr  "" "RUA GASTAO VIDIGAL" "" "RUA CAPITAO ZUZINHA" ...
##  $ complemento              : chr  "EM FRENTE AO EXTRA NA SAIDA" "EM FRENTE A UPA DA CAXANGA" "AO  LADO  DO  COLEGIO ADERBAL  GALVÃO  EM  FRENTE  AO  CONJUNTO RESIDENCIAL  ADERBAL  GALVÃO" "RUA CAPITÃO ZUZINHA" ...
##  $ bairro_cruzamento        : chr  "MADALENA" "VÁRZEA" "VASCO DA GAMA" "BOA VIAGEM" ...
##  $ num_semaforo             : chr  "" "281" "" "" ...
##  $ sentido_via              : chr  "SUBURBIO" "CIDADE" "" "SUBURBIO" ...
##  $ tipo                     : chr  "COLISÃO FRONTAL" "COLISÃO TRASEIRA" "COLISÃO COM CICLISTA" "COLISÃO LATERAL" ...
##  $ auto                     : int  1 2 1 1 1 1 1 2 2 1 ...
##  $ moto                     : int  1 0 1 1 1 0 1 0 0 1 ...
##  $ ciclom                   : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ ciclista                 : int  0 0 1 0 0 0 0 0 0 0 ...
##  $ pedestre                 : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ onibus                   : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ caminhao                 : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ viatura                  : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ outros                   : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ vitimas                  : int  1 1 1 1 2 0 1 0 0 1 ...
##  $ vitimasfatais            : int  0 0 0 0 0 0 0 0 0 0 ...
##  $ acidente_verificado      : chr  "Longo da via" "Cruzamento" "Longo da via" "Longo da via" ...
##  $ tempo_clima              : chr  "Bom" "Bom" "Bom" "Bom" ...
##  $ situacao_semaforo        : chr  "Não existe" "Sem defeito" "Não existe" "Sem defeito" ...
##  $ sinalizacao              : chr  "Perfeito estado" "Perfeito estado" "Incompleta" "Perfeito estado" ...
##  $ condicao_via             : chr  "Seca" "Oleosa" "Seca" "Seca" ...
##  $ conservacao_via          : chr  "Perfeito estado" "Perfeito estado" "Perfeito estado" "Perfeito estado" ...
##  $ ponto_controle           : chr  "Outros" "Outros" "Não existe" "Faixa de pedestre" ...
##  $ situacao_placa           : chr  "Não há placas" "Outras" "Não há placas" "Outras" ...
##  $ velocidade_max_via       : chr  "" "" "" "" ...
##  $ mao_direcao              : chr  "Dupla" "Única" "Dupla" "Única" ...
##  $ divisao_via1             : chr  "Faixa contínua" "Não existe" "Não existe" "Canal" ...
##  $ divisao_via2             : chr  "Faixa seccionada" "" "" "" ...
##  $ divisao_via3             : chr  "" "" "" "" ...

Tratamento de dados

Colocando as colunas em minúsculo

names(sinistrosRecifeRaw) <- tolower(names(sinistrosRecifeRaw))

Modifcando a data para formato date e extraindo ano, mes e dia para analises futuras

sinistrosRecifeRaw$data <- as.Date(sinistrosRecifeRaw$data, format = "%Y-%m-%d")
sinistrosRecifeRaw$ano <- as.integer(format(sinistrosRecifeRaw$data, "%Y"))
sinistrosRecifeRaw$mes <- as.integer(format(sinistrosRecifeRaw$data, "%m"))
sinistrosRecifeRaw$dia <- as.integer(format(sinistrosRecifeRaw$data, "%d"))

Extraindo o intervalo do dia a partir do campo hora

#variaveis auxiliares para tratamento do campo hora
time_06 <- as.POSIXct("06:00", format = "%H:%M")
time_12 <- as.POSIXct("12:00", format = "%H:%M")
time_18 <- as.POSIXct("18:00", format = "%H:%M")
time_2359 <- as.POSIXct("23:59", format = "%H")
time_00 <- as.POSIXct("00:00", format = "%H:%M")

#Extraindo o intervalo do dia a partir do campo hora
sinistrosRecifeRaw <- sinistrosRecifeRaw %>% 
  mutate(intervalo_dia = case_when(
    as.POSIXct(hora, format = "%H:%M") >= time_06  & as.POSIXct(hora, format = "%H:%M") < time_12 ~ "MANHA",
    as.POSIXct(hora, format = "%H:%M") >= time_12  & as.POSIXct(hora, format = "%H:%M") < time_18 ~ "TARDE",
    as.POSIXct(hora, format = "%H:%M") >= time_18  & as.POSIXct(hora, format = "%H") <= time_2359 ~ "NOITE",
    as.POSIXct(hora, format = "%H:%M") >= time_00  & as.POSIXct(hora, format = "%H:%M") < time_06 ~ "MADRUGADA",
    TRUE ~ "NAO INFORMADO"
  )
)

#removendo variaveis auxiliares para tratamento do campo hora
rm(time_06, time_12, time_18,time_2359, time_00)

Extraindo o dia da semana a partir do campo data

#Extraindo o dia da semana a partir do campo data
sinistrosRecifeRaw$dia_semana <- weekdays(as.Date(sinistrosRecifeRaw$data))

criando uma coluna a partir de varias usando a função coalesce

#criando uma coluna a partir de varias usando a função coalesce
sinistrosRecifeRaw <- sinistrosRecifeRaw %>% 
  mutate(automoveis = coalesce(auto, onibus, caminhao, viatura, ciclom)) %>%
  mutate(divisao_da_via = coalesce(divisao_via1, divisao_via2, divisao_via3)) %>%
  mutate(outros_envolvidos = coalesce(outros, ciclista, pedestre) 
)

remove as colunas que já foram unificadas e não serão necessarias mais pra frente

# remove as colunas que já foram unificadas e não serão necessarias mais pra frente
sinistrosRecifeRaw <-  sinistrosRecifeRaw %>% 
  select( -c("auto", "onibus", "caminhao", "viatura", "ciclom","divisao_via1","divisao_via2","divisao_via3", "outros", "ciclista", "pedestre"))

transforma todos os valores em “maiusculas”

# transforma todos os valores em "maiusculas"
sinistrosRecifeRaw$natureza_acidente <- toupper(sinistrosRecifeRaw$natureza_acidente)
sinistrosRecifeRaw$situacao <- toupper(sinistrosRecifeRaw$situacao)
sinistrosRecifeRaw$bairro <- toupper(sinistrosRecifeRaw$bairro)
sinistrosRecifeRaw$sentido_via <- toupper(sinistrosRecifeRaw$sentido_via)
sinistrosRecifeRaw$tipo <- toupper(sinistrosRecifeRaw$tipo)
sinistrosRecifeRaw$intervalo_dia <- toupper(sinistrosRecifeRaw$intervalo_dia)
sinistrosRecifeRaw$dia_semana <- toupper(sinistrosRecifeRaw$dia_semana)
sinistrosRecifeRaw$acidente_verificado <- toupper(sinistrosRecifeRaw$acidente_verificado)
sinistrosRecifeRaw$tempo_clima <- toupper(sinistrosRecifeRaw$tempo_clima)
sinistrosRecifeRaw$situacao_semaforo <- toupper(sinistrosRecifeRaw$situacao_semaforo)
sinistrosRecifeRaw$sinalizacao <- toupper(sinistrosRecifeRaw$sinalizacao)
sinistrosRecifeRaw$condicao_via <- toupper(sinistrosRecifeRaw$condicao_via)
sinistrosRecifeRaw$conservacao_via <- toupper(sinistrosRecifeRaw$conservacao_via)
sinistrosRecifeRaw$ponto_controle <- toupper(sinistrosRecifeRaw$ponto_controle)
sinistrosRecifeRaw$situacao_placa <- toupper(sinistrosRecifeRaw$situacao_placa)
sinistrosRecifeRaw$velocidade_max_via <- toupper(sinistrosRecifeRaw$velocidade_max_via)
sinistrosRecifeRaw$mao_direcao <- toupper(sinistrosRecifeRaw$mao_direcao)
sinistrosRecifeRaw$divisao_da_via <- toupper(sinistrosRecifeRaw$divisao_da_via)

criando a coluna de rotulo(o “y” usada nos modelos)

#criando a coluna de rotulo(o "y" usada nos modelos)
sinistrosRecifeFinal <- sinistrosRecifeRaw %>% 
  mutate(acidente_com_vitima = case_when(
    natureza_acidente == 'COM VÍTIMA' ~ 1,
    natureza_acidente == 'VÍTIMA FATAL' ~ 1,
    TRUE ~ 0
  )
)
sinistrosRecifeFinal$acidente_com_vitima <- as.integer(sinistrosRecifeFinal$acidente_com_vitima)

movendo o rotulo(“y”) para a primeira posicao do dataset

# movendo o rotulo("y") para a primeira posicao do dataset
sinistrosRecifeFinal <- sinistrosRecifeFinal %>% select(acidente_com_vitima, everything())

preenchendo valores faltantes checando se o tamanho do conteudo preenchido é menor que 1

# preenchendo valores faltantes checando se o tamanho do conteudo preenchido é menor que 1
sinistrosRecifeFinal$bairro[str_length(sinistrosRecifeFinal$bairro) < 1  ] <- "NAO INFORMADO" 
sinistrosRecifeFinal$sentido_via[str_length(sinistrosRecifeFinal$sentido_via) < 1 ] <- "NAO INFORMADO" 
sinistrosRecifeFinal$tipo[str_length(sinistrosRecifeFinal$tipo) < 1 ] <- "NAO INFORMADO" 
sinistrosRecifeFinal$intervalo_dia[str_length(sinistrosRecifeFinal$intervalo_dia) < 1 ] <- "NAO INFORMADO" 
sinistrosRecifeFinal$dia_semana[str_length(sinistrosRecifeFinal$dia_semana) < 1 ] <- "NAO INFORMADO" 
sinistrosRecifeFinal$tempo_clima[str_length(sinistrosRecifeFinal$tempo_clima) < 1 ] <- "NAO INFORMADO" 
sinistrosRecifeFinal$situacao_semaforo[str_length(sinistrosRecifeFinal$situacao_semaforo) < 1 ] <- "NAO INFORMADO" 
sinistrosRecifeFinal$situacao_placa[str_length(sinistrosRecifeFinal$situacao_placa) < 1 ] <- "NAO INFORMADO" 
sinistrosRecifeFinal$velocidade_max_via[str_length(sinistrosRecifeFinal$velocidade_max_via) < 1 ] <- "NAO INFORMADO" 
sinistrosRecifeFinal$divisao_da_via[str_length(sinistrosRecifeFinal$divisao_da_via) < 1 ] <- "NAO INFORMADO" 
sinistrosRecifeFinal$situacao[str_length(sinistrosRecifeFinal$situacao) < 1 ] <- "NAO INFORMADO" 
sinistrosRecifeFinal$natureza_acidente[str_length(sinistrosRecifeFinal$natureza_acidente) < 1 ] <- "NAO INFORMADO" 
sinistrosRecifeFinal$acidente_verificado[str_length(sinistrosRecifeFinal$acidente_verificado) < 1 ] <- "NAO INFORMADO" 
sinistrosRecifeFinal$sinalizacao[str_length(sinistrosRecifeFinal$sinalizacao) < 1 ] <- "NAO INFORMADO" 
sinistrosRecifeFinal$conservacao_via[str_length(sinistrosRecifeFinal$conservacao_via) < 1  ] <- "NAO INFORMADO" 
sinistrosRecifeFinal$condicao_via[str_length(sinistrosRecifeFinal$condicao_via) < 1 ] <- "NAO INFORMADO" 
sinistrosRecifeFinal$ponto_controle[str_length(sinistrosRecifeFinal$ponto_controle) < 1 ] <- "NAO INFORMADO" 
sinistrosRecifeFinal$mao_direcao[str_length(sinistrosRecifeFinal$mao_direcao) < 1 ] <- "NAO INFORMADO" 

Visulizando a distribuicao do preenchimento das principais colunas

observando quantitativamente os dados

##                                            variable q_zeros      p_zeros q_na
## acidente_com_vitima             acidente_com_vitima     546 0.2294117647    0
## data                                           data       0 0.0000000000    0
## hora                                           hora       0 0.0000000000    0
## natureza_acidente                 natureza_acidente       0 0.0000000000    0
## situacao                                   situacao       0 0.0000000000    0
## bairro                                       bairro       0 0.0000000000    0
## endereco                                   endereco       0 0.0000000000    0
## numero                                       numero       0 0.0000000000    0
## detalhe_endereco_acidente detalhe_endereco_acidente       0 0.0000000000    0
## complemento                             complemento       0 0.0000000000    0
## bairro_cruzamento                 bairro_cruzamento       0 0.0000000000    0
## num_semaforo                           num_semaforo       1 0.0004201681    0
## sentido_via                             sentido_via       0 0.0000000000    0
## tipo                                           tipo       0 0.0000000000    0
## moto                                           moto     946 0.3974789916    0
## vitimas                                     vitimas     557 0.2340336134    0
## vitimasfatais                         vitimasfatais    2355 0.9894957983    0
## acidente_verificado             acidente_verificado       0 0.0000000000    0
## tempo_clima                             tempo_clima       0 0.0000000000    0
## situacao_semaforo                 situacao_semaforo       0 0.0000000000    0
## sinalizacao                             sinalizacao       0 0.0000000000    0
## condicao_via                           condicao_via       0 0.0000000000    0
## conservacao_via                     conservacao_via       0 0.0000000000    0
## ponto_controle                       ponto_controle       0 0.0000000000    0
## situacao_placa                       situacao_placa       0 0.0000000000    0
## velocidade_max_via               velocidade_max_via       0 0.0000000000    0
## mao_direcao                             mao_direcao       0 0.0000000000    0
## ano                                             ano       0 0.0000000000    0
## mes                                             mes       0 0.0000000000    0
## dia                                             dia       0 0.0000000000    0
## intervalo_dia                         intervalo_dia       0 0.0000000000    0
## dia_semana                               dia_semana       0 0.0000000000    0
## automoveis                               automoveis     645 0.2710084034    0
## divisao_da_via                       divisao_da_via       0 0.0000000000    0
## outros_envolvidos                 outros_envolvidos    2365 0.9936974790    0
##                           p_na q_inf p_inf      type unique
## acidente_com_vitima          0     0     0   integer      2
## data                         0     0     0      Date    363
## hora                         0     0     0 character   1019
## natureza_acidente            0     0     0 character      4
## situacao                     0     0     0 character      4
## bairro                       0     0     0 character     89
## endereco                     0     0     0 character    551
## numero                       0     0     0 character    909
## detalhe_endereco_acidente    0     0     0 character    505
## complemento                  0     0     0 character   2115
## bairro_cruzamento            0     0     0 character     89
## num_semaforo                 0     0     0 character    333
## sentido_via                  0     0     0 character     42
## tipo                         0     0     0 character     21
## moto                         0     0     0   integer      5
## vitimas                      0     0     0   integer      7
## vitimasfatais                0     0     0   integer      2
## acidente_verificado          0     0     0 character      8
## tempo_clima                  0     0     0 character      4
## situacao_semaforo            0     0     0 character      6
## sinalizacao                  0     0     0 character      5
## condicao_via                 0     0     0 character      5
## conservacao_via              0     0     0 character      5
## ponto_controle               0     0     0 character      6
## situacao_placa               0     0     0 character     21
## velocidade_max_via           0     0     0 character     12
## mao_direcao                  0     0     0 character      3
## ano                          0     0     0   integer      1
## mes                          0     0     0   integer     12
## dia                          0     0     0   integer     31
## intervalo_dia                0     0     0 character      4
## dia_semana                   0     0     0 character      7
## automoveis                   0     0     0   integer      8
## divisao_da_via               0     0     0 character      9
## outros_envolvidos            0     0     0   integer      3

Construindo gráficos

observando quantitativamente os dados

observando quantitativamente os dados

Enriquecimento de dados

# Junta os dados das duas fontes acima a partir das colunas ["bairro"] existente em cada fonte
sinistrosRecifeFinal <- left_join(sinistrosRecifeFinal, numero_acidentes_com_vitimas_por_bairro, by = c("bairro" = "bairro")) 

#Se algum bairro nao apresente total de acidentes c/vitimas será preenchido com ZERO (0) para evitar o NA value
sinistrosRecifeFinal$total_acidentes_com_vitimas_por_bairro <- 
  replace(
    sinistrosRecifeFinal$total_acidentes_com_vitimas_por_bairro, 
    is.na(sinistrosRecifeFinal$total_acidentes_com_vitimas_por_bairro), 
    0
  )

#ncol(sinistrosRecifeFinal)
#nrow(sinistrosRecifeFinal)

head(sinistrosRecifeFinal, 5)
##   acidente_com_vitima       data     hora natureza_acidente   situacao
## 1                   1 2021-01-01 19:44:00        COM VÍTIMA FINALIZADA
## 2                   1 2021-01-01 23:15:40        COM VÍTIMA FINALIZADA
## 3                   1 2021-01-02 10:54:00        COM VÍTIMA FINALIZADA
## 4                   1 2021-01-02 11:13:00        COM VÍTIMA FINALIZADA
## 5                   1 2021-01-03 09:32:00        COM VÍTIMA FINALIZADA
##           bairro                         endereco numero
## 1       MADALENA                      RUA BENFICA       
## 2         VÁRZEA                       AV CAXANGA       
## 3  VASCO DA GAMA                   RUA RESPLENDOR    353
## 4     BOA VIAGEM    RUA VISCONDE DE JEQUITINHONHA     22
## 5 ILHA DO RETIRO AV ENGENHEIRO ABDIAS DE CARVALHO    365
##   detalhe_endereco_acidente
## 1                          
## 2        RUA GASTAO VIDIGAL
## 3                          
## 4       RUA CAPITAO ZUZINHA
## 5                          
##                                                                                    complemento
## 1                                                                  EM FRENTE AO EXTRA NA SAIDA
## 2                                                                   EM FRENTE A UPA DA CAXANGA
## 3 AO  LADO  DO  COLEGIO ADERBAL  GALVÃO  EM  FRENTE  AO  CONJUNTO RESIDENCIAL  ADERBAL  GALVÃO
## 4                                                                          RUA CAPITÃO ZUZINHA
## 5                                                    EM FRENTE A LANCHONETE COXINHAS DE BATATA
##   bairro_cruzamento num_semaforo   sentido_via                 tipo moto
## 1          MADALENA                   SUBURBIO              COLISAO    1
## 2            VÁRZEA          281        CIDADE              COLISAO    0
## 3     VASCO DA GAMA              NAO INFORMADO COLISAO COM CICLISTA    1
## 4        BOA VIAGEM                   SUBURBIO              COLISAO    1
## 5    ILHA DO RETIRO              NAO INFORMADO              COLISAO    1
##   vitimas vitimasfatais acidente_verificado tempo_clima situacao_semaforo
## 1       1             0        LONGO DA VIA         BOM        NÃO EXISTE
## 2       1             0          CRUZAMENTO         BOM       SEM DEFEITO
## 3       1             0        LONGO DA VIA         BOM        NÃO EXISTE
## 4       1             0        LONGO DA VIA         BOM       SEM DEFEITO
## 5       2             0        LONGO DA VIA         BOM       SEM DEFEITO
##       sinalizacao condicao_via conservacao_via    ponto_controle situacao_placa
## 1 PERFEITO ESTADO         SECA PERFEITO ESTADO            OUTROS  NÃO HÁ PLACAS
## 2 PERFEITO ESTADO       OLEOSA PERFEITO ESTADO            OUTROS         OUTRAS
## 3      INCOMPLETA         SECA PERFEITO ESTADO        NÃO EXISTE  NÃO HÁ PLACAS
## 4 PERFEITO ESTADO         SECA PERFEITO ESTADO FAIXA DE PEDESTRE         OUTRAS
## 5 PERFEITO ESTADO         SECA PERFEITO ESTADO FAIXA DE PEDESTRE         OUTRAS
##   velocidade_max_via mao_direcao  ano mes dia intervalo_dia  dia_semana
## 1      NAO INFORMADO       DUPLA 2021   1   1         NOITE SEXTA FEIRA
## 2      NAO INFORMADO       ÚNICA 2021   1   1         NOITE SEXTA FEIRA
## 3      NAO INFORMADO       DUPLA 2021   1   2         MANHA      SÁBADO
## 4      NAO INFORMADO       ÚNICA 2021   1   2         MANHA      SÁBADO
## 5               60KM       DUPLA 2021   1   3         MANHA     DOMINGO
##   automoveis divisao_da_via outros_envolvidos
## 1          1 FAIXA CONTÍNUA                 0
## 2          2     NÃO EXISTE                 0
## 3          1     NÃO EXISTE                 0
## 4          1          CANAL                 0
## 5          1 FAIXA CONTÍNUA                 0
##   total_acidentes_com_vitimas_por_bairro
## 1                                     80
## 2                                     34
## 3                                     10
## 4                                    198
## 5                                     11

Removendo da memoria alguns objetos que nao serão mais utilizados

rm( sinistrosRecifeRaw,
    acidentes_com_vitimas_por_bairro,
    acidentes_condicao_via,
    acidentes_dia_semana,
    acidentes_interv_dia,
    bairro_acidente,
    condicao_tempo_clima,
    direcao_via,
    distribuicao_natureza_acidente,
    estado_vias,
    numero_acidentes_com_vitimas_por_bairro,
    ocorrencias_mes,
    ocorrencias_situacao,
    situacao_placa_amostra,
    tipos_acidentes,
    velocidade_max_via_amostra
    )

Filtrando apenas os registros cujo status é finalizado que é o que interessa para treinar os modelos

sinistrosRecifeFinal <- sinistrosRecifeFinal %>%  filter(situacao == 'FINALIZADA') 
ncol(sinistrosRecifeFinal)
## [1] 36
nrow(sinistrosRecifeFinal)
## [1] 2096

Removendo colunas que nao precisam fazer parte do dataset ou que podem enviesar os modelos

sinistrosRecifeFinal <-  sinistrosRecifeFinal %>% 
  select( -c("data","hora","ano", "mes", "dia","vitimas", "vitimasfatais", "bairro", "endereco", "numero", "detalhe_endereco_acidente", "complemento", "natureza_acidente", "sentido_via", "num_semaforo", "situacao", "bairro_cruzamento"))

Conferindo a remoção das colunas

#observa a estrutura dos dados
status(sinistrosRecifeFinal)
##                                                                      variable
## acidente_com_vitima                                       acidente_com_vitima
## tipo                                                                     tipo
## moto                                                                     moto
## acidente_verificado                                       acidente_verificado
## tempo_clima                                                       tempo_clima
## situacao_semaforo                                           situacao_semaforo
## sinalizacao                                                       sinalizacao
## condicao_via                                                     condicao_via
## conservacao_via                                               conservacao_via
## ponto_controle                                                 ponto_controle
## situacao_placa                                                 situacao_placa
## velocidade_max_via                                         velocidade_max_via
## mao_direcao                                                       mao_direcao
## intervalo_dia                                                   intervalo_dia
## dia_semana                                                         dia_semana
## automoveis                                                         automoveis
## divisao_da_via                                                 divisao_da_via
## outros_envolvidos                                           outros_envolvidos
## total_acidentes_com_vitimas_por_bairro total_acidentes_com_vitimas_por_bairro
##                                        q_zeros     p_zeros q_na p_na q_inf
## acidente_com_vitima                        441 0.210400763    0    0     0
## tipo                                         0 0.000000000    0    0     0
## moto                                       803 0.383110687    0    0     0
## acidente_verificado                          0 0.000000000    0    0     0
## tempo_clima                                  0 0.000000000    0    0     0
## situacao_semaforo                            0 0.000000000    0    0     0
## sinalizacao                                  0 0.000000000    0    0     0
## condicao_via                                 0 0.000000000    0    0     0
## conservacao_via                              0 0.000000000    0    0     0
## ponto_controle                               0 0.000000000    0    0     0
## situacao_placa                               0 0.000000000    0    0     0
## velocidade_max_via                           0 0.000000000    0    0     0
## mao_direcao                                  0 0.000000000    0    0     0
## intervalo_dia                                0 0.000000000    0    0     0
## dia_semana                                   0 0.000000000    0    0     0
## automoveis                                 576 0.274809160    0    0     0
## divisao_da_via                               0 0.000000000    0    0     0
## outros_envolvidos                         2082 0.993320611    0    0     0
## total_acidentes_com_vitimas_por_bairro       7 0.003339695    0    0     0
##                                        p_inf      type unique
## acidente_com_vitima                        0   integer      2
## tipo                                       0 character     11
## moto                                       0   integer      5
## acidente_verificado                        0 character      8
## tempo_clima                                0 character      4
## situacao_semaforo                          0 character      6
## sinalizacao                                0 character      5
## condicao_via                               0 character      5
## conservacao_via                            0 character      5
## ponto_controle                             0 character      6
## situacao_placa                             0 character      5
## velocidade_max_via                         0 character      6
## mao_direcao                                0 character      3
## intervalo_dia                              0 character      4
## dia_semana                                 0 character      7
## automoveis                                 0   integer      6
## divisao_da_via                             0 character      9
## outros_envolvidos                          0   integer      3
## total_acidentes_com_vitimas_por_bairro     0   numeric     43

Convertando em valores binários

#definindo uma semente
set.seed(1401)

#define one-hot encoding function
sinistrosRecifeDummy <- dummyVars(" ~ .", data=sinistrosRecifeFinal)
#perform one-hot encoding on data frame
sinistrosRecifeBinarizado <- data.frame(predict(sinistrosRecifeDummy, newdata=sinistrosRecifeFinal))

# imprime o dataset final convertido em valores numéricos 
# para facilitar a execução de uma Regressão Linear, por exemplo
head(sinistrosRecifeBinarizado, 3)
##   acidente_com_vitima tipoATROPELAMENTO tipoCAPOTAMENTO tipoCHOQUE tipoCOLISAO
## 1                   1                 0               0          0           1
## 2                   1                 0               0          0           1
## 3                   1                 0               0          0           0
##   tipoCOLISAO.COM.CICLISTA tipoENGAVETAMENTO tipoNAO.INFORMADO tipoOUTROS
## 1                        0                 0                 0          0
## 2                        0                 0                 0          0
## 3                        1                 0                 0          0
##   tipoQUEDA tipoSEMÁFORO tipoTOMBAMENTO moto acidente_verificadoCRUZAMENTO
## 1         0            0              0    1                             0
## 2         0            0              0    0                             1
## 3         0            0              0    1                             0
##   acidente_verificadoESQUINA acidente_verificadoLONGO.DA.VIA
## 1                          0                               1
## 2                          0                               0
## 3                          0                               1
##   acidente_verificadoNAO.INFORMADO acidente_verificadoOUTROS
## 1                                0                         0
## 2                                0                         0
## 3                                0                         0
##   acidente_verificadoPONTE acidente_verificadoROTATÓRIA
## 1                        0                            0
## 2                        0                            0
## 3                        0                            0
##   acidente_verificadoVIADUTO tempo_climaBOM tempo_climaCHUVOSO
## 1                          0              1                  0
## 2                          0              1                  0
## 3                          0              1                  0
##   tempo_climaNAO.INFORMADO tempo_climaNUBLADO situacao_semaforoCOM.DEFEITO
## 1                        0                  0                            0
## 2                        0                  0                            0
## 3                        0                  0                            0
##   situacao_semaforoDESLIGADO situacao_semaforoINTERMITENTE
## 1                          0                             0
## 2                          0                             0
## 3                          0                             0
##   situacao_semaforoNÃO.EXISTE situacao_semaforoNAO.INFORMADO
## 1                           1                              0
## 2                           0                              0
## 3                           1                              0
##   situacao_semaforoSEM.DEFEITO sinalizacaoILEGÍVEL sinalizacaoINCOMPLETA
## 1                            0                   0                     0
## 2                            1                   0                     0
## 3                            0                   0                     1
##   sinalizacaoNÃO.EXISTENTE sinalizacaoNAO.INFORMADO sinalizacaoPERFEITO.ESTADO
## 1                        0                        0                          1
## 2                        0                        0                          1
## 3                        0                        0                          0
##   condicao_viaMOLHADA condicao_viaNAO.INFORMADO condicao_viaOLEOSA
## 1                   0                         0                  0
## 2                   0                         0                  1
## 3                   0                         0                  0
##   condicao_viaOUTROS condicao_viaSECA conservacao_viaMAL.CONSERVADA
## 1                  0                1                             0
## 2                  0                0                             0
## 3                  0                1                             0
##   conservacao_viaMAL.ILUMINADA conservacao_viaNAO.INFORMADO
## 1                            0                            0
## 2                            0                            0
## 3                            0                            0
##   conservacao_viaOUTROS conservacao_viaPERFEITO.ESTADO ponto_controleAGENTE
## 1                     0                              1                    0
## 2                     0                              1                    0
## 3                     0                              1                    0
##   ponto_controleFAIXA.DE.PEDESTRE ponto_controleFAIXA.DE.RETENÇÃO
## 1                               0                               0
## 2                               0                               0
## 3                               0                               0
##   ponto_controleNÃO.EXISTE ponto_controleNAO.INFORMADO ponto_controleOUTROS
## 1                        0                           0                    1
## 2                        0                           0                    1
## 3                        1                           0                    0
##   situacao_placaNÃO.HÁ.PLACAS situacao_placaNAO.INFORMADO situacao_placaOUTRAS
## 1                           1                           0                    0
## 2                           0                           0                    1
## 3                           1                           0                    0
##   situacao_placaPLACAS.PARE situacao_placaR.6A velocidade_max_via20KM
## 1                         0                  0                      0
## 2                         0                  0                      0
## 3                         0                  0                      0
##   velocidade_max_via30KM velocidade_max_via40KM velocidade_max_via50KM
## 1                      0                      0                      0
## 2                      0                      0                      0
## 3                      0                      0                      0
##   velocidade_max_via60KM velocidade_max_viaNAO.INFORMADO mao_direcaoDUPLA
## 1                      0                               1                1
## 2                      0                               1                0
## 3                      0                               1                1
##   mao_direcaoNAO.INFORMADO mao_direcaoÚNICA intervalo_diaMADRUGADA
## 1                        0                0                      0
## 2                        0                1                      0
## 3                        0                0                      0
##   intervalo_diaMANHA intervalo_diaNOITE intervalo_diaTARDE dia_semanaDOMINGO
## 1                  0                  1                  0                 0
## 2                  0                  1                  0                 0
## 3                  1                  0                  0                 0
##   dia_semanaQUARTA.FEIRA dia_semanaQUINTA.FEIRA dia_semanaSÁBADO
## 1                      0                      0                0
## 2                      0                      0                0
## 3                      0                      0                1
##   dia_semanaSEGUNDA.FEIRA dia_semanaSEXTA.FEIRA dia_semanaTERÇA.FEIRA
## 1                       0                     1                     0
## 2                       0                     1                     0
## 3                       0                     0                     0
##   automoveis divisao_da_viaBLOCOS divisao_da_viaCANAL
## 1          1                    0                   0
## 2          2                    0                   0
## 3          1                    0                   0
##   divisao_da_viaCANTEIRO.CENTRAL divisao_da_viaFAIXA
## 1                              0                   0
## 2                              0                   0
## 3                              0                   0
##   divisao_da_viaFAIXA.CONTÍNUA divisao_da_viaFAIXA.SECCIONADA
## 1                            1                              0
## 2                            0                              0
## 3                            0                              0
##   divisao_da_viaNÃO.EXISTE divisao_da_viaNAO.INFORMADO divisao_da_viaOUTROS
## 1                        0                           0                    0
## 2                        1                           0                    0
## 3                        1                           0                    0
##   outros_envolvidos total_acidentes_com_vitimas_por_bairro
## 1                 0                                     80
## 2                 0                                     34
## 3                 0                                     10

Treino e Teste: Pré-processamento

Particionando os dados

# deve-se somente converter em factor se nao for usar Regressão Linear como um dos metodos
sinistrosRecifeBinarizado$acidente_com_vitima = as.factor(sinistrosRecifeBinarizado$acidente_com_vitima)

particao_sinistros = caret::createDataPartition(sinistrosRecifeBinarizado$acidente_com_vitima, p=.7, list = F) # cria a partição 70-30
treino_sinistros = sinistrosRecifeBinarizado[particao_sinistros, ] # treino
teste_sinistros = sinistrosRecifeBinarizado[-particao_sinistros, ] # - treino = teste

Criando o controle para validação cruzada

# Controle de treinamento
train.control <- trainControl(method = "cv", number = 10, verboseIter = T) # controle de treino

Treinando os modelos

Bagging com Floresta Aleatória
## + Fold01: mtry= 2 
## - Fold01: mtry= 2 
## + Fold01: mtry=45 
## - Fold01: mtry=45 
## + Fold01: mtry=88 
## - Fold01: mtry=88 
## + Fold02: mtry= 2 
## - Fold02: mtry= 2 
## + Fold02: mtry=45 
## - Fold02: mtry=45 
## + Fold02: mtry=88 
## - Fold02: mtry=88 
## + Fold03: mtry= 2 
## - Fold03: mtry= 2 
## + Fold03: mtry=45 
## - Fold03: mtry=45 
## + Fold03: mtry=88 
## - Fold03: mtry=88 
## + Fold04: mtry= 2 
## - Fold04: mtry= 2 
## + Fold04: mtry=45 
## - Fold04: mtry=45 
## + Fold04: mtry=88 
## - Fold04: mtry=88 
## + Fold05: mtry= 2 
## - Fold05: mtry= 2 
## + Fold05: mtry=45 
## - Fold05: mtry=45 
## + Fold05: mtry=88 
## - Fold05: mtry=88 
## + Fold06: mtry= 2 
## - Fold06: mtry= 2 
## + Fold06: mtry=45 
## - Fold06: mtry=45 
## + Fold06: mtry=88 
## - Fold06: mtry=88 
## + Fold07: mtry= 2 
## - Fold07: mtry= 2 
## + Fold07: mtry=45 
## - Fold07: mtry=45 
## + Fold07: mtry=88 
## - Fold07: mtry=88 
## + Fold08: mtry= 2 
## - Fold08: mtry= 2 
## + Fold08: mtry=45 
## - Fold08: mtry=45 
## + Fold08: mtry=88 
## - Fold08: mtry=88 
## + Fold09: mtry= 2 
## - Fold09: mtry= 2 
## + Fold09: mtry=45 
## - Fold09: mtry=45 
## + Fold09: mtry=88 
## - Fold09: mtry=88 
## + Fold10: mtry= 2 
## - Fold10: mtry= 2 
## + Fold10: mtry=45 
## - Fold10: mtry=45 
## + Fold10: mtry=88 
## - Fold10: mtry=88 
## Aggregating results
## Selecting tuning parameters
## Fitting mtry = 88 on full training set
plot(sinistros_RF) # evolução do modelo

var_importance <- varImp(sinistros_RF, scale = T) # importância de cada variável
plot(var_importance, top = 20) # plot de importância

Árvore de Decisão
## + Fold01: cp=0.02265 
## - Fold01: cp=0.02265 
## + Fold02: cp=0.02265 
## - Fold02: cp=0.02265 
## + Fold03: cp=0.02265 
## - Fold03: cp=0.02265 
## + Fold04: cp=0.02265 
## - Fold04: cp=0.02265 
## + Fold05: cp=0.02265 
## - Fold05: cp=0.02265 
## + Fold06: cp=0.02265 
## - Fold06: cp=0.02265 
## + Fold07: cp=0.02265 
## - Fold07: cp=0.02265 
## + Fold08: cp=0.02265 
## - Fold08: cp=0.02265 
## + Fold09: cp=0.02265 
## - Fold09: cp=0.02265 
## + Fold10: cp=0.02265 
## - Fold10: cp=0.02265 
## Aggregating results
## Selecting tuning parameters
## Fitting cp = 0.0227 on full training set
fancyRpartPlot(sinistros_RPART$finalModel) # desenho da árvore

var_importance <- varImp(sinistros_RPART)
plot(var_importance, top = 20) # importância das variáveis

Boosting com Boosted Generalized Linear Model
sinistros_ADA <- train(acidente_com_vitima ~ ., data = treino_sinistros, method = "glmboost", trControl = train.control)
## + Fold01: mstop=150, prune=no 
## - Fold01: mstop=150, prune=no 
## + Fold02: mstop=150, prune=no 
## - Fold02: mstop=150, prune=no 
## + Fold03: mstop=150, prune=no 
## - Fold03: mstop=150, prune=no 
## + Fold04: mstop=150, prune=no 
## - Fold04: mstop=150, prune=no 
## + Fold05: mstop=150, prune=no 
## - Fold05: mstop=150, prune=no 
## + Fold06: mstop=150, prune=no 
## - Fold06: mstop=150, prune=no 
## + Fold07: mstop=150, prune=no 
## - Fold07: mstop=150, prune=no 
## + Fold08: mstop=150, prune=no 
## - Fold08: mstop=150, prune=no 
## + Fold09: mstop=150, prune=no 
## - Fold09: mstop=150, prune=no 
## + Fold10: mstop=150, prune=no 
## - Fold10: mstop=150, prune=no 
## Aggregating results
## Selecting tuning parameters
## Fitting mstop = 150, prune = no on full training set
#summary(sinistros_ADA) # sumário
plot(sinistros_ADA) # evolução do modelo

print(sinistros_ADA) # modelo
## Boosted Generalized Linear Model 
## 
## 1468 samples
##   88 predictor
##    2 classes: '0', '1' 
## 
## No pre-processing
## Resampling: Cross-Validated (10 fold) 
## Summary of sample sizes: 1321, 1321, 1322, 1322, 1321, 1321, ... 
## Resampling results across tuning parameters:
## 
##   mstop  Accuracy   Kappa    
##    50    0.8760367  0.5509391
##   100    0.8794381  0.5628703
##   150    0.8828394  0.5781570
## 
## Tuning parameter 'prune' was held constant at a value of no
## Accuracy was used to select the optimal model using the largest value.
## The final values used for the model were mstop = 150 and prune = no.
var_importance <- varImp(sinistros_ADA)
plot(var_importance, top = 20) # importância das variáveis

KNN
sinistros_KNN <- train(acidente_com_vitima ~ ., data = treino_sinistros, method = "knn", trControl = train.control)
## + Fold01: k=5 
## - Fold01: k=5 
## + Fold01: k=7 
## - Fold01: k=7 
## + Fold01: k=9 
## - Fold01: k=9 
## + Fold02: k=5 
## - Fold02: k=5 
## + Fold02: k=7 
## - Fold02: k=7 
## + Fold02: k=9 
## - Fold02: k=9 
## + Fold03: k=5 
## - Fold03: k=5 
## + Fold03: k=7 
## - Fold03: k=7 
## + Fold03: k=9 
## - Fold03: k=9 
## + Fold04: k=5 
## - Fold04: k=5 
## + Fold04: k=7 
## - Fold04: k=7 
## + Fold04: k=9 
## - Fold04: k=9 
## + Fold05: k=5 
## - Fold05: k=5 
## + Fold05: k=7 
## - Fold05: k=7 
## + Fold05: k=9 
## - Fold05: k=9 
## + Fold06: k=5 
## - Fold06: k=5 
## + Fold06: k=7 
## - Fold06: k=7 
## + Fold06: k=9 
## - Fold06: k=9 
## + Fold07: k=5 
## - Fold07: k=5 
## + Fold07: k=7 
## - Fold07: k=7 
## + Fold07: k=9 
## - Fold07: k=9 
## + Fold08: k=5 
## - Fold08: k=5 
## + Fold08: k=7 
## - Fold08: k=7 
## + Fold08: k=9 
## - Fold08: k=9 
## + Fold09: k=5 
## - Fold09: k=5 
## + Fold09: k=7 
## - Fold09: k=7 
## + Fold09: k=9 
## - Fold09: k=9 
## + Fold10: k=5 
## - Fold10: k=5 
## + Fold10: k=7 
## - Fold10: k=7 
## + Fold10: k=9 
## - Fold10: k=9 
## Aggregating results
## Selecting tuning parameters
## Fitting k = 7 on full training set
# summary(sinistros_KNN) # sumário do modelo de vizinhança
plot(sinistros_KNN)

var_importance <- varImp(sinistros_KNN)
plot(var_importance, top = 20) # importância das variáveis

Selecionando o melhor modelo
melhor_modelo <- resamples(list(
  #LM = sinistros_LM, 
  KNN = sinistros_KNN, 
  RPART = sinistros_RPART, 
  RF = sinistros_RF,   
  ADABOOST = sinistros_ADA))

melhor_modelo
## 
## Call:
## resamples.default(x = list(KNN = sinistros_KNN, RPART = sinistros_RPART, RF
##  = sinistros_RF, ADABOOST = sinistros_ADA))
## 
## Models: KNN, RPART, RF, ADABOOST 
## Number of resamples: 10 
## Performance metrics: Accuracy, Kappa 
## Time estimates for: everything, final model fit
summary(melhor_modelo)
## 
## Call:
## summary.resamples(object = melhor_modelo)
## 
## Models: KNN, RPART, RF, ADABOOST 
## Number of resamples: 10 
## 
## Accuracy 
##               Min.   1st Qu.    Median      Mean   3rd Qu.      Max. NA's
## KNN      0.8163265 0.8384354 0.8435374 0.8439987 0.8551859 0.8639456    0
## RPART    0.8503401 0.8603229 0.8775510 0.8746669 0.8888967 0.8979592    0
## RF       0.8707483 0.8837597 0.8877551 0.8978334 0.9214193 0.9319728    0
## ADABOOST 0.8424658 0.8690476 0.8843537 0.8828394 0.8911565 0.9315068    0
## 
## Kappa 
##               Min.   1st Qu.    Median      Mean   3rd Qu.      Max. NA's
## KNN      0.3197913 0.3940855 0.4432638 0.4260329 0.4563530 0.5196826    0
## RPART    0.4464766 0.5254149 0.5855512 0.5661974 0.6246062 0.6388206    0
## RF       0.5536199 0.6111716 0.6464390 0.6736003 0.7607615 0.8003260    0
## ADABOOST 0.4110838 0.5192768 0.5987918 0.5781570 0.6233016 0.7734327    0
Executando um predict de test com todos os modelos

Executando um predict de test com o melhor modelo analisado pela media do MAE

Criando a matriz de confusão e visualizando a acuidade do modelo

## Confusion Matrix and Statistics
## 
##           Reference
## Prediction   0   1
##          0  89  28
##          1  43 468
##                                           
##                Accuracy : 0.8869          
##                  95% CI : (0.8595, 0.9106)
##     No Information Rate : 0.7898          
##     P-Value [Acc > NIR] : 1.099e-10       
##                                           
##                   Kappa : 0.6447          
##                                           
##  Mcnemar's Test P-Value : 0.09661         
##                                           
##             Sensitivity : 0.6742          
##             Specificity : 0.9435          
##          Pos Pred Value : 0.7607          
##          Neg Pred Value : 0.9159          
##              Prevalence : 0.2102          
##          Detection Rate : 0.1417          
##    Detection Prevalence : 0.1863          
##       Balanced Accuracy : 0.8089          
##                                           
##        'Positive' Class : 0               
## 
##           Reference
## Prediction   0   1
##          0  89  28
##          1  43 468
## [1] 0.6679784

Criando a matriz de confusão e visualizando a acuidade do ADA

## Confusion Matrix and Statistics
## 
##           Reference
## Prediction   0   1
##          0  76   9
##          1  56 487
##                                         
##                Accuracy : 0.8965        
##                  95% CI : (0.87, 0.9192)
##     No Information Rate : 0.7898        
##     P-Value [Acc > NIR] : 9.503e-13     
##                                         
##                   Kappa : 0.6414        
##                                         
##  Mcnemar's Test P-Value : 1.159e-08     
##                                         
##             Sensitivity : 0.5758        
##             Specificity : 0.9819        
##          Pos Pred Value : 0.8941        
##          Neg Pred Value : 0.8969        
##              Prevalence : 0.2102        
##          Detection Rate : 0.1210        
##    Detection Prevalence : 0.1354        
##       Balanced Accuracy : 0.7788        
##                                         
##        'Positive' Class : 0             
## 
## [1] 0.6679784

Criando a matriz de confusão e visualizando a acuidade do RPART

## Confusion Matrix and Statistics
## 
##           Reference
## Prediction   0   1
##          0  76   9
##          1  56 487
##                                         
##                Accuracy : 0.8965        
##                  95% CI : (0.87, 0.9192)
##     No Information Rate : 0.7898        
##     P-Value [Acc > NIR] : 9.503e-13     
##                                         
##                   Kappa : 0.6414        
##                                         
##  Mcnemar's Test P-Value : 1.159e-08     
##                                         
##             Sensitivity : 0.5758        
##             Specificity : 0.9819        
##          Pos Pred Value : 0.8941        
##          Neg Pred Value : 0.8969        
##              Prevalence : 0.2102        
##          Detection Rate : 0.1210        
##    Detection Prevalence : 0.1354        
##       Balanced Accuracy : 0.7788        
##                                         
##        'Positive' Class : 0             
## 
## [1] 0.6679784

Criando a matriz de confusão e visualizando a acuidade do ADA

## Confusion Matrix and Statistics
## 
##           Reference
## Prediction   0   1
##          0  45  22
##          1  87 474
##                                           
##                Accuracy : 0.8264          
##                  95% CI : (0.7945, 0.8553)
##     No Information Rate : 0.7898          
##     P-Value [Acc > NIR] : 0.01242         
##                                           
##                   Kappa : 0.362           
##                                           
##  Mcnemar's Test P-Value : 8.783e-10       
##                                           
##             Sensitivity : 0.34091         
##             Specificity : 0.95565         
##          Pos Pred Value : 0.67164         
##          Neg Pred Value : 0.84492         
##              Prevalence : 0.21019         
##          Detection Rate : 0.07166         
##    Detection Prevalence : 0.10669         
##       Balanced Accuracy : 0.64828         
##                                           
##        'Positive' Class : 0               
## 
##           Reference
## Prediction   0   1
##          0  45  22
##          1  87 474
## [1] 0.6679784